home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 315_01 / ftgraph.c < prev    next >
Text File  |  1990-05-14  |  35KB  |  1,492 lines

  1. /* modified 11/89 by T Clune to allow override of autoscaling on graphs. */
  2. /* This lets the user set two or more graphs to the same scale if he likes. */
  3. /* See readme.txt for details on usage. */ 
  4.  
  5. /* modified 10/89 to use MSHERC.COM for Hercules support instead of my */
  6. /* Hercules driver.  Microsoft verified that MSHERC.COM can be distributed */
  7. /* with applications without infringing on their rights, 10/89. */
  8. /* Also, changed to accept defaults for all inputs as a mouse support */
  9. /* feature.  In addition, mgetch() and mgets() from MENU.C are now used */
  10. /* to automatically determine whether the mouse is being supported for */
  11. /* input, instead of changing the function pointers for input statements */
  12. /* depending on how mouse_flag is initialized.  Since the function pointers */
  13. /* have not been removed, this change is essentially meaningless here. */
  14. /* Modified by T Clune */
  15.  
  16. /* Modified 4/89 by Tom Clune to circumvent some versions of DOS that */
  17. /* do not contain the filespec of the program in ARGV[0].  graph_init() */
  18. /* first tries the argv[0] value, and if that fails, tries the name in */
  19. /* the #define, which is the filename with no  path (i.e., requires that */
  20. /* you use the default path for the config file) value before aborting. */
  21. /* Because the name is in FTGRAPH.H, you must edit FTGRAPH.H to use the */
  22. /* name you will be using for the program before compiling. */
  23.  
  24. /* modified 4/89 by Tom Clune to support CGA, VGA, and EGA graphics */
  25. /* to link the program, use: LINK FTGRAPH,,,FTPLOT MOUSELIB MOUSE GRAPHICS */
  26. /* Note that the library GRAPHICS of MS C v. 5.1 must be invoked */
  27. /* explicitly during linking.  Similarly, for the no-mouse version */
  28. /* of ftgraph, link: FTGRAPH,,,FTPLOT NONMOUSE GRAPHICS. */
  29.  
  30. /* Written 3/89 by T Clune to plot FFT and IFT data. */
  31. /* ftgraph.c uses text-mode (ASCII-format) data files structured as */
  32. /* follows: Line 1 will contain an integer specifying the number of data */
  33. /* points in the data set and two floating point values, the minimum and */
  34. /* maximum value for the y-axis of the graph.                           */
  35. /* The rest of the file is the floating-point data values, separated by */
  36. /* white-space characters (space, carriage-return/line-feed, or tab). */
  37. /* To compile this program, use Microsoft C, v.5, large memory model. */
  38. /* I compiled it will optimization disabled (as I do for all my programs) */
  39. /* but I have no reason to believe that optimization will cause the */
  40. /* the program to fail. */
  41. /* To run the program, FTGRAPH.CNF must be in the same directory as */
  42. /* FTGRAPH.EXE, and you must have DEVICE=ANSI.SYS in your config.sys file */
  43. /* Copyright (c) 1989, Eye Research Institute.  All Rights Reserved. */
  44.  
  45. #include "mouselib.h"
  46. #include "msc_grph.h"
  47. #include "ansi.h"
  48. #include "fft.h"
  49. #include "hpgl.h"
  50. #include "hpglplot.h"
  51. #include "ftgraph.h"
  52. #include "menu.h"
  53. #include "keys.h"
  54. #include <stdlib.h>
  55. #include <process.h>
  56. #include <graph.h>
  57. #include <malloc.h>
  58. #include <math.h>
  59. #include <stdio.h>
  60. #include <conio.h>
  61. #include <string.h>
  62.  
  63. static void graph_init(), reset_options(), ft(), graph_out(), correlate();
  64. static void write_data(), ft_multiply(), autopower(), crosspower();
  65. static int ft_process(), binary_choice();
  66. static void ft_save(), display_menu(), printout(), peak_extract();
  67. static char *get_prompt();
  68. static double *get_data();
  69. static void filter_main(), ft_filter();
  70. static getsfuncptr get_string;
  71. static intptr pause_func;
  72.  
  73. static double min_amp, filter_units;
  74. static int ft_coords, ft_pos_neg, ft_precis, mouse_flag;
  75.  
  76. void main(argc, argv)
  77. int argc;
  78. char *argv[];
  79. {
  80.     FILE *f;
  81.  
  82.     static char *options[] =
  83.     {
  84.     "Quit",
  85.     "Reset options",
  86.     "Forward transform (file output)",
  87.     "Inverse transform (file output)",
  88.     "Multiply two data files (file output)",
  89.     "Auto-power spectrum (file output)",
  90.     "Cross-power spectrum (file output)",
  91.     "Correlation from power spectrum data (file output)",
  92.     "Filter time-domain real data (file output)",
  93.     "Display data file (HPGL, graphics screen, or printer)"
  94.     };
  95.  
  96.     /* menu parameters.  See menu.c documentation */
  97.     int top, left, tab, columns, spacing, entries, auto_label;
  98.  
  99.     int choice; /* menu selection variable */
  100.     top=3;      /* initialize menu variables */
  101.     left=20;
  102.     tab=0;
  103.     columns=1;
  104.     spacing=2;
  105.     entries=10;
  106.     auto_label= -2;
  107.  
  108.     graph_init(argv[0]);
  109.  
  110.     /* if mouse enabled, set menu variable for mouse operation */
  111.     if(mouse_flag==MOUSE_ON)
  112.     mouse_flag_toggle(MOUSE_PLUS_KEYBOARD);
  113.  
  114.     reset_menu(0);
  115.  
  116.     for(;;)
  117.     {
  118.         /* CLS, POSITION, and CHAR_ATTRIBUTE are ANSI.H macros */
  119.     CLS;
  120.  
  121.     POSITION(20,1); /* center heading */
  122.     CHAR_ATTRIBUTE(UNDERSCORE);
  123.  
  124.     printf("MAIN MENU -- FFT GRAPHING FUNCTIONS\n");
  125.  
  126.     CHAR_ATTRIBUTE(NORMAL);
  127.  
  128.     while(kbhit())
  129.         getch();
  130.  
  131.  
  132.         /* get a menu selection */
  133.     choice=menu(top,left,tab,columns,spacing,entries,auto_label,options);
  134.  
  135.     switch(choice)  /* see the OPTION strings for meaning of choice */
  136.     {
  137.         case 0:
  138.             CLS;
  139.             exit(0);
  140.         case 1:
  141.             CLS;
  142.             reset_options();
  143.             reset_menu(choice);
  144.             break;
  145.         case 2:
  146.             CLS;
  147.             ft(FORWARD);
  148.             reset_menu(choice);
  149.             break;
  150.         case 3:
  151.             CLS;
  152.             ft(INVERSE);
  153.             reset_menu(choice);
  154.             break;
  155.         case 4:
  156.             CLS;
  157.             ft_multiply();
  158.             reset_menu(choice);
  159.             break;
  160.         case 5:
  161.             CLS;
  162.             autopower();
  163.             reset_menu(choice);
  164.             break;
  165.  
  166.         case 6:
  167.             CLS;
  168.             crosspower();
  169.             reset_menu(choice);
  170.             break;
  171.         case 7:
  172.             CLS;
  173.             correlate();
  174.             reset_menu(choice);
  175.             break;
  176.         case 8:
  177.             CLS;
  178.             filter_main();
  179.             reset_menu(choice);
  180.             break;
  181.         case 9:
  182.             CLS;
  183.             display_menu();
  184.             reset_menu(choice);
  185.             break;
  186.         default:
  187.             break;
  188.  
  189.     }
  190.  
  191.     }
  192.  
  193. }
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200. /* autopower() performs an auto power spectrum on the selected data */
  201.  
  202. static void autopower()
  203. {
  204.     static double *x, *y, *minval, *maxval;
  205.     static string_struc f;
  206.     static int n;
  207.     int i;
  208.     char c;
  209.     int coords;
  210.  
  211.     CLS;
  212.     printf("This auto power routine asks only for the real data set.\n");
  213.     printf("NOTE WELL:  The autopower FT has different units than a normal FT, and is\n");
  214.     printf("called variously an auto spectrum, a power spectrum or the power spectral\n");
  215.     printf("density of the data set.\n");
  216.     printf("NOTICE: Since a power spectrum is defined relative to the area under\n");
  217.     printf("the PSD AMPLITUDE graph, this routine produces polar format output,\n");
  218.     printf("no matter what coordinate system you are using for FTs.\n");
  219.     printf("Phase data for a power spectrum is meaningless, and will not be saved\n");
  220.     printf("The inverse FT of this routine's output is called an autocorrelation\n");
  221.     printf("and is a measure of the extent to which the data set is self-similar\n");
  222.     printf("If you want to inverse-transform the output, you should make sure\n");
  223.     printf("that you have positive/negative selected for your transform option.\n");
  224.     printf("Because of the way that various flags internal to the program are set,\n");
  225.     printf("you should use the CORRELATION menu option instead of INVERSE TRANSFORM\n");
  226.     printf("to obtain the correlation IFT.\n");
  227.     printf("The IFT (auto-correlation) will have 0 lag in center-screen.\n");
  228.     printf("0 lag is perfect correlation (unshifted data correlates exactly to itself)\n\n");
  229.     printf("Now, select the data file.  Press any key to continue.\n");
  230.     (* pause_func)();
  231.  
  232.     coords=ft_coords;
  233.     ft_coords=POWER;
  234.  
  235.     do
  236.     {
  237.     f=get_file();
  238.     if(f.error_flag != 0)
  239.     {
  240.         printf("Do you want to abort this function and return to the main menu (y/N)?\n");
  241.         c=binary_choice('N','Y');
  242.         if(c=='Y')
  243.         {
  244.         ft_coords=coords;
  245.         return;
  246.         }
  247.     }
  248.     }while(f.error_flag != 0);
  249.  
  250.     x=get_data(f.string,x,&n,minval, maxval);
  251.  
  252.     y=(double *)calloc(n, sizeof(double));
  253.     if(y==NULL)
  254.     {
  255.     printf("Error allocat